package system.student.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

public class MapperUtil {
    // 全局单例 SqlSessionFactory（仅初始化一次）
    private static final SqlSessionFactory SQL_SESSION_FACTORY;

    // 静态代码块初始化（应用启动时执行一次）
    static {
        String resource = "mybatis-config.xml";
        InputStream inputStream;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            throw new RuntimeException("加载 MyBatis 配置失败：" + e.getMessage(), e);
        }
        SQL_SESSION_FACTORY = new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 获取 SqlSessionFactory（全局单例）
     */
    public static SqlSessionFactory getSqlSessionFactory() {
        return SQL_SESSION_FACTORY;
    }

    /**
     * 获取 Mapper 实例（自动提交开启）
     * @param mapperInterface Mapper 接口类（如 UserMapper.class）
     * @param <T> Mapper 接口类型
     * @return Mapper 代理对象
     */
    public static <T> T getMapper(Class<T> mapperInterface) {
        // 创建 SqlSession 时启用自动提交（autoCommit = true）
        SqlSession sqlSession = SQL_SESSION_FACTORY.openSession(true);

        try {
            return sqlSession.getMapper(mapperInterface);
        } catch (Exception e) {
            // 异常时关闭 SqlSession（避免资源泄漏）
            closeSqlSession(sqlSession);
            throw new RuntimeException("获取 Mapper 失败：" + e.getMessage(), e);
        }
    }

    /**
     * 关闭 SqlSession（避免资源泄漏）
     */
    private static void closeSqlSession(SqlSession sqlSession) {
        if (sqlSession != null) {
            try {
                sqlSession.close();
            } catch (Exception e) {
                System.err.println("关闭 SqlSession 失败：" + e.getMessage());
            }
        }
    }
}